package br.uff.mic1.model;

import java.util.Arrays;

public class BancoRegistradores 
{

	public final static int PC = 0;
	public final static int AC = 1;
	public final static int SP = 2;
	public final static int IR = 3;
	public final static int TIR = 4;
	public final static int ZERO = 5;
	public final static int MAIS_UM = 6;
	public final static int MENOS_UM = 7;
	public final static int AMASK = 8;
	public final static int SMASK = 9;
	public final static int A = 10;
	public final static int B = 11;
	public final static int C = 12;
	public final static int D = 13;
	public final static int E = 14;
	public final static int F = 15;
	
	public final static int TAMANHO_REGISTRADOR = 16;
	
	
	
	private String[] registradores = new String[16];
	
	public BancoRegistradores()
	{
		//inicializa os registradores com os valores iniciais
		this.registradores[BancoRegistradores.PC] = "0000000000000000"; //0
		this.registradores[BancoRegistradores.AC] = "0000000000000000"; //0
		this.registradores[BancoRegistradores.SP] = "0001000000000000"; //4096
		this.registradores[BancoRegistradores.IR] = "0000000000000000"; //0
		this.registradores[BancoRegistradores.TIR] = "0000000000000000"; //0
		this.registradores[BancoRegistradores.ZERO] = "0000000000000000"; //0
		this.registradores[BancoRegistradores.MAIS_UM] = "0000000000000001"; //1
		this.registradores[BancoRegistradores.MENOS_UM] = "1111111111111111"; //-1
		this.registradores[BancoRegistradores.AMASK] = "0000111111111111";
		this.registradores[BancoRegistradores.SMASK] = "0000000011111111";
		this.registradores[BancoRegistradores.A] = "0000000000000000"; //0
		this.registradores[BancoRegistradores.B] = "0000000000000000"; //0
		this.registradores[BancoRegistradores.C] = "0000000000000000"; //0
		this.registradores[BancoRegistradores.D] = "0000000000000000"; //0
		this.registradores[BancoRegistradores.E] = "0000000000000000"; //0
		this.registradores[BancoRegistradores.F] = "0000000000000000"; //0
	}
	
	public String getRegistrador(int numero) throws IllegalArgumentException
	{
		if (numero < BancoRegistradores.PC || numero > BancoRegistradores.F)
			throw new IllegalArgumentException("Registrador inexistente!");
		return this.registradores[numero];
	}
	
	public void setRegistrador(int numero, String valor) throws IllegalArgumentException
	{
		if (numero < BancoRegistradores.PC || numero > BancoRegistradores.F)
			throw new IllegalArgumentException("Registrador inexistente!");
		
		if (valor != null && valor.length() > 16)
			throw new IllegalArgumentException("Numero de bits muito grande.");
		
		this.registradores[numero] = valor;
	}
	
	@Override
	public String toString() 
	{
		StringBuffer s = new StringBuffer();
		s.append("Banco de Registradores\n");
		s.append("\nPC = "+this.registradores[BancoRegistradores.PC]);
		s.append("\nAC = "+this.registradores[BancoRegistradores.AC]);
		s.append("\nSP = "+this.registradores[BancoRegistradores.SP]);
		s.append("\nIR = "+this.registradores[BancoRegistradores.IR]);
		s.append("\nTIR = "+this.registradores[BancoRegistradores.TIR]);
		s.append("\nZERO = "+this.registradores[BancoRegistradores.ZERO]);
		s.append("\nMAIS UM = "+this.registradores[BancoRegistradores.MAIS_UM]);
		s.append("\nMENOS UM = "+this.registradores[BancoRegistradores.MENOS_UM]);
		s.append("\nAMASK = "+this.registradores[BancoRegistradores.AMASK]);
		s.append("\nSMASK = "+this.registradores[BancoRegistradores.SMASK]);
		s.append("\nA = "+this.registradores[BancoRegistradores.A]);
		s.append("\nB = "+this.registradores[BancoRegistradores.B]);
		s.append("\nC = "+this.registradores[BancoRegistradores.C]);
		s.append("\nD = "+this.registradores[BancoRegistradores.D]);
		s.append("\nE = "+this.registradores[BancoRegistradores.E]);
		s.append("\nF = "+this.registradores[BancoRegistradores.F]);
		
		return s.toString();
	}
	
}
